﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.Drawing;
using memo;

namespace memoTest
{
    /// <summary>
    /// Content osztályának unit tesztje.
    /// </summary>
    [TestClass]
    public class ContentTest
    {
        /// <summary>
        /// Empty Constructor to speed up compilation.
        /// </summary>
        public ContentTest() { }

        #region Constructors tests.
        #region Constructor Title tests.
        /// <summary>
        /// Title paraméteres konsruktor tesztelése title megadásával.
        /// </summary>
        [TestMethod]
        public void ContentConstructorTitleTestWithTitle()
        {
            string expectedTitle = "Egy hűtlen vejét fülöncsípő, dühös mexikói úr Wesselényinél mázol Quitóban.";
            string expectedDetails = default(string);
            List<Image> expectedImages = default(List<Image>);
            List<AudioFile> expectedAudios = default(List<AudioFile>);
            List<VideoFile> expectedVideos = default(List<VideoFile>);
            Content testcontent = new Content(expectedTitle);
            Assert.AreEqual(expectedTitle, testcontent.Title,
                string.Format("Az ellenőrzésnél a title nem egyezik a várttitleal: '{0}' helyett '{1}' szerepel.",
                expectedTitle, testcontent.Title));
            Assert.AreEqual(expectedDetails, testcontent.Details,
                string.Format("Az ellenőrzésnél a details nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedDetails, testcontent.Details));
            Assert.AreEqual(expectedImages, testcontent.Pictures,
                string.Format("Az ellenőrzésnél a képek listája nem egyezik a várt listával: '{0}' helyett '{1}' szerepel.",
                expectedImages, testcontent.Pictures));
            Assert.AreEqual(expectedAudios, testcontent.Audios,
                string.Format("Az ellenőrzésnél a hangok nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedAudios, testcontent.Audios));
            Assert.AreEqual(expectedVideos, testcontent.Videos,
                string.Format("Az ellenőrzésnél a videók nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedVideos, testcontent.Videos));
        }

        /// <summary>
        /// Title paraméteres konsruktor tesztelése title megadása nélkül.
        /// </summary>
        [TestMethod]
        public void ContentConstructorTitleTestWithoutTitle()
        {
            string expectedTitle = "Untitled";
            string expectedDetails = default(string);
            List<Image> expectedImages = default(List<Image>);
            List<AudioFile> expectedAudios = default(List<AudioFile>);
            List<VideoFile> expectedVideos = default(List<VideoFile>);
            Content testcontent = new Content(default(string));
            Assert.AreEqual(expectedTitle, testcontent.Title,
                string.Format("Az ellenőrzésnél a title nem egyezik a várttitleal: '{0}' helyett '{1}' szerepel.",
                expectedTitle, testcontent.Title));
            Assert.AreEqual(expectedDetails, testcontent.Details,
                string.Format("Az ellenőrzésnél a details nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedDetails, testcontent.Details));
            Assert.AreEqual(expectedImages, testcontent.Pictures,
                string.Format("Az ellenőrzésnél a képek listája nem egyezik a várt listával: '{0}' helyett '{1}' szerepel.",
                expectedImages, testcontent.Pictures));
            Assert.AreEqual(expectedAudios, testcontent.Audios,
                string.Format("Az ellenőrzésnél a hangok nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedAudios, testcontent.Audios));
            Assert.AreEqual(expectedVideos, testcontent.Videos,
                string.Format("Az ellenőrzésnél a videók nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedVideos, testcontent.Videos));
        }
        #endregion

        #region Constructor Title, Details, Pictures, Audios, Videos and Icon tests.
        /// <summary>
        ///Content konstruktor teszt az összes paraméter megadásával.
        /// </summary>
        [TestMethod]
        public void ContentConstructorTitleDetailsPicturesAudiosAndVideosTestWithTitleDetailsPicturesAudiosAndVideosIcon()
        {
            string expectedTitle = "Vörös csillag, ragyogj és trónolj,\nMióta ember néz az égre,\nVörös csillag volt a reménye.";
            string expectedDetails = "Ide is kéne valami szöveg majd kitalálok valamit.";
            List<string> expectedImages = InitializePictures();
            List<AudioFile> expectedAudios = InitializeAudios();
            List<VideoFile> expectedVideos = InitializeVideos();
            Image expectedIcon = Properties.Resources.testIcon;
            Content testcontent = new Content(expectedTitle, expectedDetails, expectedImages, expectedAudios, expectedVideos, expectedIcon);
            Assert.AreEqual(expectedTitle, testcontent.Title,
                string.Format("Az ellenőrzésnél a title nem egyezik a várt titleal: '{0}' helyett '{1}' szerepel.",
                expectedTitle, testcontent.Title));
            Assert.AreEqual(expectedDetails, testcontent.Details,
                string.Format("Az ellenőrzésnél a details nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedDetails, testcontent.Details));
            Assert.AreEqual(expectedImages, testcontent.Pictures,
                string.Format("Az ellenőrzésnél a képek listája nem egyezik a várt listával: '{0}' helyett '{1}' szerepel.",
                expectedImages, testcontent.Pictures));
            Assert.AreEqual(expectedAudios, testcontent.Audios,
                string.Format("Az ellenőrzésnél a Hangok nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedAudios, testcontent.Audios));
            Assert.AreEqual(expectedVideos, testcontent.Videos,
                string.Format("Az ellenőrzésnél a Videók nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedVideos, testcontent.Videos));
            Assert.AreEqual(expectedIcon, testcontent.Icon, "Az ellenőrzésnél a két ikon nem egyezett meg.");
        }

        /// <summary>
        /// Content konstruktor teszt az összes paraméter megadásával kivéve a title paramétert.
        /// </summary>
        [TestMethod]
        public void ContentConstructorTitleDetailsPricturesAudiosAndVideosTestWithoutTitleWithDetailsPicturesAudiosAndVideosIcon()
        {
            string expectedTitle = "Untitled";
            string expectedDetails = "Az előzőben nem találtam ki szöveget de jól van az úgy meg ez is jól van így :).";
            List<string> expectedImages = InitializePictures();
            List<AudioFile> expectedAudios = InitializeAudios();
            List<VideoFile> expectedVideos = InitializeVideos();
            Image expectedIcon = Properties.Resources.testIcon;
            Content testcontent = new Content(default(string), expectedDetails, expectedImages, expectedAudios, expectedVideos, expectedIcon);
            Assert.AreEqual(expectedTitle, testcontent.Title,
                string.Format("Az ellenőrzésnél a title nem egyezik a várt titleal: '{0}' helyett '{1}' szerepel.",
                expectedTitle, testcontent.Title));
            Assert.AreEqual(expectedDetails, testcontent.Details,
                string.Format("Az ellenőrzésnél a details nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedDetails, testcontent.Details));
            Assert.AreEqual(expectedImages, testcontent.Pictures,
                string.Format("Az ellenőrzésnél a képek listája nem egyezik a várt listával: '{0}' helyett '{1}' szerepel.",
                expectedImages, testcontent.Pictures));
            Assert.AreEqual(expectedAudios, testcontent.Audios,
                string.Format("Az ellenőrzésnél a Hangok nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedAudios, testcontent.Audios));
            Assert.AreEqual(expectedVideos, testcontent.Videos,
                string.Format("Az ellenőrzésnél a Videók nem egyezik a várt detailssal: '{0}' helyett '{1}' szerepel.",
                expectedVideos, testcontent.Videos));
            Assert.AreEqual(expectedIcon, testcontent.Icon, "Az ellenőrzésnél a két ikon nem egyezett meg.");
        }
        #endregion
        #endregion

        #region TODO: 6 teszt egy elem hozzáadása listához
        #endregion

        #region TODO: 6 teszt egy referencia elem törlése a listából exceptionnal és 6 teszt index alapú elem törlésre
        #endregion

        #region TODO: 3 teszt teljes lista kiürítése
        #endregion

        #region Lista típusú fieldek inicializálása a tesztek végrehajtásához.
        /// <summary>
        /// Képekből álló 12 elemű lista létrehozása a tesztesetekez.
        /// </summary>
        /// <returns>A képeket tartalmazó lista.</returns>
        private List<string> InitializePictures()
        {
            List<string> initPicture = new List<string>();
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            initPicture.Add("DEFAULT.png");
            return initPicture;
        }

        /// <summary>
        /// Audió fájlokból álló 12 elemű lista létrehozása a tesztesetekez.
        /// </summary>
        /// <returns>Audió fájlokat tartalmazó lista.</returns>
        private List<AudioFile> InitializeAudios()
        {
            List<AudioFile> initAudio = new List<AudioFile>();
            initAudio.Add(new AudioFile("audiotest/audio1.mp3", AudioFile.AudioFormat.MP3));
            initAudio.Add(new AudioFile("audiotest/audio1.ogg", AudioFile.AudioFormat.OGG));
            initAudio.Add(new AudioFile("audiotest/audio1.wav", AudioFile.AudioFormat.WAV));
            initAudio.Add(new AudioFile("audiotest/audio2.mp3", AudioFile.AudioFormat.MP3));
            initAudio.Add(new AudioFile("audiotest/audio2.ogg", AudioFile.AudioFormat.OGG));
            initAudio.Add(new AudioFile("audiotest/audio2.wav", AudioFile.AudioFormat.WAV));
            initAudio.Add(new AudioFile("audiotest/audio3.mp3", AudioFile.AudioFormat.MP3));
            initAudio.Add(new AudioFile("audiotest/audio3.ogg", AudioFile.AudioFormat.OGG));
            initAudio.Add(new AudioFile("audiotest/audio3.wav", AudioFile.AudioFormat.WAV));
            initAudio.Add(new AudioFile("audiotest/audio4.mp3", AudioFile.AudioFormat.MP3));
            initAudio.Add(new AudioFile("audiotest/audio4.ogg", AudioFile.AudioFormat.OGG));
            initAudio.Add(new AudioFile("audiotest/audio4.wav", AudioFile.AudioFormat.WAV));
            return initAudio;
        }

        /// <summary>
        /// Videó fájlokból álló 12 elemű lista létrehozása a tesztesetekez.
        /// </summary>
        /// <returns>Videó fájlokat tartalmazó lista.</returns>
        private List<VideoFile> InitializeVideos()
        {
            List<VideoFile> initVideo = new List<VideoFile>();
            initVideo.Add(new VideoFile("videotest/video1.avi", VideoFile.VideoFormat.AVI));
            initVideo.Add(new VideoFile("videotest/video1.mkv", VideoFile.VideoFormat.MKV));
            initVideo.Add(new VideoFile("videotest/video1.mp4", VideoFile.VideoFormat.MP4));
            initVideo.Add(new VideoFile("videotest/video1.mpg", VideoFile.VideoFormat.MPG));
            initVideo.Add(new VideoFile("videotest/video2.avi", VideoFile.VideoFormat.AVI));
            initVideo.Add(new VideoFile("videotest/video2.wav", VideoFile.VideoFormat.MKV));
            initVideo.Add(new VideoFile("videotest/video2.mp4", VideoFile.VideoFormat.MP4));
            initVideo.Add(new VideoFile("videotest/video2.mpg", VideoFile.VideoFormat.MPG));
            initVideo.Add(new VideoFile("videotest/video3.avi", VideoFile.VideoFormat.AVI));
            initVideo.Add(new VideoFile("videotest/video3.mkv", VideoFile.VideoFormat.MKV));
            initVideo.Add(new VideoFile("videotest/video3.mp4", VideoFile.VideoFormat.MP4));
            initVideo.Add(new VideoFile("videotest/video3.mpg", VideoFile.VideoFormat.MPG));
            return initVideo;
        }
        #endregion
    }
}
